package eva.savant.business.compras.view

import eva.savant.business.compras.service.TSCompra
import eva.savant.business.material.view.Bean
import eva.savant.businessobject.cm.Compra
import eva.savant.businessobject.cm.CompraDetalle
import eva.savant.businessobject.cm.Proveedor
import eva.savant.businessobject.mt.*
import org.primefaces.event.SelectEvent

import javax.faces.bean.ManagedBean
import javax.faces.bean.SessionScoped
import javax.annotation.PostConstruct
import javax.faces.convert.Converter

@SessionScoped
@ManagedBean(name = 'ITCompra')
public class ITCompra extends Bean {

  def XMaterialCod='', persona

  CompraDetalle detalle; TSCompra tsCompra

  def lsAlmacen, lsAlmacenId

  Boolean credito

  @PostConstruct
  public void cleanEntity() {

    focus= 'ps:materialId:valueId'

    tsCompra= (TSCompra) getSpringBean('tsCompra')


    entity= new Compra(); init()

    entity.solicitud= null

    entity.recepcion= new Date()

    entity.almacen= new Almacen()

    entity.proveedor= new Proveedor()

    entity.lsCompraDetalle= new ArrayList<CompraDetalle>()


    lsEntity= new ArrayList<Compra>()


    credito= false

    XMaterialCod= ''

    detalle= new CompraDetalle()

    detalle.material= new Material()


    entity.almacenero= get(Almacenero,'usuario.id=?',usuario.id)

    if(entity.almacenero == null) { addErrorMessage 'El usuario no esta registrado como almacenero'; return }


    lsAlmacen= find(AlmaceneroAlmacen.class,'almacen: almacenero.id=?',entity.almacenero.id)

    if(lsAlmacen?.size() < 1) { addErrorMessage 'El usuario no tiene asignado almacenes'; return }


    lsAlmacenId= new ArrayList();  for(almacen in lsAlmacen) lsAlmacenId.add(almacen.id)
  }

  public List findLsEntity() {

    return find(Compra.class,'almacen.id in (?) order by id desc',lsAlmacenId)
  }

  public void editEntity(Object id) {

    isRead= true

    entity= get(Compra.class,id)
  }

  public void XMaterialFind() {

    detalle.material= get(Material.class,'rapido=?',toInteger(XMaterialCod))

    if(detalle.material == null) detalle.material= get(Material.class, sociedad.id + XMaterialCod)

    if(detalle.material == null) detalle.material= get(Material.class,'barras=?', XMaterialCod)

    if(detalle.material != null) XMaterialSelect()
  }

  public void XMaterialSelect() {   // precargar valores  cal importe

    focus= 'ps:cantidadId:valueId'

    XMaterialCod= detalle.material.codigo

    def i= get(Inventario.class,'almacen.id=? and material.id=?',entity.almacen.id,detalle.material.id)

    detalle.stock = i != null ? i.actual : null

    detalle.precio= i.saldoCosto
  }

  public void detailAdd() {

    if(detalle.material?.id == null) { addErrorMessage 'Debe seleccionar un producto'; return; }


    if(detalle.cantidad < 1) {

    addErrorMessage 'La cantidad de producto debe ser mayor a cero'; return; }


    def d= new CompraDetalle()

    d.material = detalle.material

    d.cantidad = detalle.cantidad

    d.precio   = detalle.precio

    d.importe  = d.cantidad * d.precio


    detailDelete(d)

    entity.lsCompraDetalle.add d; calculateSummary()


    detalle= new CompraDetalle()

    detalle.material= new Material()


    XMaterialCod= ''


    focus= 'ps:materialId:valueId'
  }

  public void detailEdit(SelectEvent event) {

    if(isRead) return

    def x            = (CompraDetalle) event.object

    detalle          = new CompraDetalle()

    detalle.material = x.material

    detalle.cantidad = x.cantidad

    detalle.precio   = x.precio

    detalle.importe  = x.importe

    XMaterialCod     = x.material.codigo
  }

  public void detailDelete(CompraDetalle detalle) {

    if(isRead) return

    for(int i=0; i < entity.lsCompraDetalle.size(); i++) {

    def d= entity.lsCompraDetalle.get(i)

    if(d.material.id.equalsIgnoreCase(detalle.material.id)) { entity.lsCompraDetalle.remove(i); break }  }

    calculateSummary()
  }

  public boolean mergeEntity(Object entity) { entity= (Compra) entity; alta(entity)

    if(entity.lsCompraDetalle?.size() < 1) { addErrorMessage 'El detalle productos esta vacio'; return false }

    return tsCompra.save(entity)
  }

  public void removeEntity(Object entity) {

    tsCompra.delete((Compra)entity)

    addInfoMessage 'Se anulo correctamente la compra'
  }

  public void calculateSummary() {

    entity.importe= 0

    for(x in entity.lsCompraDetalle) { entity.importe   = entity.importe   + x.importe }
  }

  public List complete(String value) { return completeLike(Proveedor.class,'persona.nombre',value) }

  public Converter getConverter() { return converterLike(Proveedor.class) }

  def getXMaterialConverter() { return converterLike(Material.class) }

  def XMaterialComplete(String value) { return completeLike(Material.class,'nombre',value) }
}
